/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dca.sistemascontrole.malhadecontrole;

import br.ufrn.dca.controle.QuanserClientException;
import dca.sistemascontrole.driver.GerenciadorComunicacao;
import dca.sistemascontrole.exception.LogManager;
import dca.sistemascontrole.exception.QuarserClientNullException;
import dca.sistemascontrole.handler.HandlerMainFrame;
import dca.sistemascontrole.view.components.VariaveisObservaveis;
import java.util.concurrent.ExecutionException;
import javax.swing.SwingWorker;

/**
 *
 * @author Rafael
 */
public class Controlador extends SwingWorker<VariaveisObservaveis, Object> {

    private MalhaDeControle malhaDeControle;
    private HandlerMainFrame handlerMainFrame;
    private GerenciadorComunicacao gerenciadorComunicacao;

    public Controlador(MalhaDeControle malhaDeControle, HandlerMainFrame handlerMainFrame, GerenciadorComunicacao gerenciadorComunicacao) {
        this.malhaDeControle = malhaDeControle;
        this.handlerMainFrame = handlerMainFrame;
        this.gerenciadorComunicacao = gerenciadorComunicacao;
    }

    @Override
    protected VariaveisObservaveis doInBackground() throws Exception {
        try {
            double nivelTanqueSuperior = gerenciadorComunicacao.readTanqueSuperior();
            double nivelTanqueInferior = gerenciadorComunicacao.readTanqueInferior();

            double valorEscrita = malhaDeControle.getValorEscrita(nivelTanqueSuperior, nivelTanqueInferior);
            valorEscrita = gerenciadorComunicacao.escreverValor(valorEscrita);

            return new VariaveisObservaveis(nivelTanqueSuperior, nivelTanqueInferior, valorEscrita);
        } catch (QuanserClientException ex) {
            gerenciadorComunicacao.haltComunicacao();
        } catch (QuarserClientNullException ex) {
            gerenciadorComunicacao.haltComunicacao();
        }

        return null;
    }

    @Override
    protected void done() {
        try {
            VariaveisObservaveis variaveisObservaveis = get();
            if (variaveisObservaveis != null) {
                handlerMainFrame.setVariaveisObservaveis(variaveisObservaveis);
            }
        } catch (InterruptedException ex) {
            LogManager.logErro(ex, "Erro no done do controlador.");
        } catch (ExecutionException ex) {
            LogManager.logErro(ex, "Erro no done do controlador.");
        }
    }
}
